package main

import (
	"fmt"
	"sort"
)

func merge(intervals [][]int) [][]int {
	//对二维数组进行排序
	sort.Slice(intervals, func(i, j int) bool {
		return intervals[i][0] < intervals[j][0]
	})
	res := [][]int{}
	prev := intervals[0]

	for i := 1; i < len(intervals); i++ {
		cur := intervals[i]
		//这个比的也很有特点，用prev上限和cur的下线去比的。
		//prev的上限小于cur的下线  =>完全就没有交集
		if prev[1] < cur[0] { // 没有一点重合
			//没有交集就要进行保存，后面要输出
			res = append(res, prev)
			//把下一个数组赋值给prev,相当于前进一步
			prev = cur
			//prev的上限大于等于cur的下线  =>有交集的情况
		} else {
			// 有重合prev[1]是[1,3]中大的那一头，3的位置，
			//如果有交集，就把上限提高
			prev[1] = max(prev[1], cur[1])
		}
	}
	//这一步是将最后一个元素加入到res中，不然会漏掉了最后一个元素 i= len(intervals)的时候
	res = append(res, prev)
	return res
}

func max(a, b int) int {
	if a > b { return a }
	return b
}

func main(){
	A :=[][]int{{1,3},{2,6},{8,10},{15,18}}
	fmt.Println(merge(A))
}